package com.gws.juc;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


class ShareData{
	private int number = 1; // A:1 B:2 C:3  标识符
	private Lock lock = new ReentrantLock();
	private Condition c1 = lock.newCondition();
	private Condition c2 = lock.newCondition();
	private Condition c3 = lock.newCondition();
	
	public void print5(){
		lock.lock();
		try {
			//1 判断
			while(number != 1){
				c1.await();
			}
			//2 干活
			for (int i = 1; i <= 5; i++) {
				System.out.println(Thread.currentThread().getName()+"\t"+i);
			}
			//3 通知
			number = 2;
			c2.signal();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
		
	}
	
	public void print10(){
		lock.lock();
		try {
			//1 判断
			while(number != 2){
				c2.await();
			}
			//2 干活
			for (int i = 1; i <= 10; i++) {
				System.out.println(Thread.currentThread().getName()+"\t"+i);
			}
			//3 通知
			number = 3;
			c3.signal();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
		
	}
	
	public void print15(){
		lock.lock();
		try {
			//1 判断
			while(number != 3){
				c3.await();
			}
			//2 干活
			for (int i = 1; i <= 15; i++) {
				System.out.println(Thread.currentThread().getName()+"\t"+i);
			}
			//3 通知
			number = 1;
			c1.signal();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
		
	}
	
}
/**
 * @author gws
 * 多线程定点通知
 * 备注：多线程之间要求按照如下顺序A>B>C
 * 三个线程要求如下：
 * AA打印5次，BB打印10次，CC打印15次
 * 接着
 * AA打印5次，BB打印10次，CC打印15次
 * 来10轮
 */
public class ConditionDemo {
	public static void main(String[] args) {
		ShareData sd = new ShareData();
		new Thread(() ->{
			for (int i = 1; i <= 10; i++) {
				sd.print5();
			}
		}, "A").start();
		new Thread(() ->{
			for (int i = 1; i <= 10; i++) {
				sd.print10();
			}
		}, "B").start();
		new Thread(() ->{
			for (int i = 1; i <= 10; i++) {
				sd.print15();
			}
		}, "C").start();
		
	}

}
